package regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test1 {
	
	// 最简单的， 元字符
	public static void test1() {
		String s = "a1b2c3a1d4";
		String regex="a1"; //正则
		Pattern p=Pattern.compile(regex);  //编译正则
		Matcher m=p.matcher(s);  // 匹配字符串
		String ok= m.replaceAll("_");
		System.out.println(ok);
	}
	
	
	public static void test2() {
		String s = "a1b2c3a1d4";
		//String regex="[abc]"; //正则 三个选一个
		String regex="[^abc]"; 
		Pattern p=Pattern.compile(regex);  //编译正则
		Matcher m=p.matcher(s);  // 匹配字符串
		String ok= m.replaceAll("_");
		System.out.println(ok);
	}
	
	// 范围 [a-zA-Z0-9]
	public static void test3() {
		String s = "abcdefghijklmnokprstuvwxyzAKURDZ";
		String regex="[h-uA-K]"; 
		Pattern p=Pattern.compile(regex);  //编译正则
		Matcher m=p.matcher(s);  // 匹配字符串
		String ok= m.replaceAll("=");
		System.out.println(ok);
	}
	
	//  \d   [0-9] 
	//  \w   字母,数字,_
	//  \s   等效于空白字符，包括空格、制表符、换页符等
	//  \D  \W  \S 
	//  .  除换行回车，其他的所有字符
	public static void test4() {
		String s="a23456";
		String regex="\\w\\d\\d\\d\\d\\d"; 
		Pattern p=Pattern.compile(regex);  //编译正则
		Matcher m=p.matcher(s);  // 匹配字符串
		
		System.out.println( m.matches() );
		
	}
	
	// 边界 \b 单词边界    ^ 以什么开始  $ 以什么结束
	public static void test5() {
		String s = "this is a test isEmpty";
		String regex="\\bis\\b";
		
		String s1 = "abc is abc man abc";
		String reg1="^abc";  //以什么开头
		String reg2="abc$";
		
		Pattern p=Pattern.compile(reg2);  //编译正则
		Matcher m=p.matcher(s1);  // 匹配字符串
		String ok=m.replaceAll("_");
		System.out.println(ok);
	}
	
	// 量词  
	/*
	   {m,n}  最少m次，最多n次
	   {m,}   最少m次，最多无限
	   {m}    必须m次
	          ?         出现0,1次
	          +        至少出现1次
	    *   0-n次
	 */
	public static void test6(){
		String s = "8976";  //如何去表示QQ号（ 5-12）
		String regex="[1-9]\\d{4,11}";
		
		Pattern p=Pattern.compile(regex);  //编译正则
		Matcher m=p.matcher(s);  // 匹配字符串
		
		System.out.println( m.matches() );
		
	}
	
	// 贪婪(默认)  量词后加？ 变非贪婪
	public static void test7() {
		String s = "12345678";
		String regex = "\\d{3,6}";
		
		Pattern p=Pattern.compile(regex);  //编译正则
		Matcher m=p.matcher(s);  // 匹配字符串
		String ok=m.replaceAll("_");
		System.out.println(ok);
	}
	
	// 分组
	public static void test8() {
		String s = "a1b2c3dd";
		String regex = "([a-z]\\d){3}"; 
		
		Pattern p=Pattern.compile(regex);  //编译正则
		Matcher m=p.matcher(s);  // 匹配字符串
		String ok=m.replaceAll("_");
		System.out.println(ok);
		
		// 如何匹配 
	}
	
	
	//  2019-01-05 --> 01/05/2019
	//  1  2  3   -->  2  3  1
	public static void test9() {
		String s1="2019-01-05";
		String reg1="(\\d{4})-(\\d{2})-(\\d{2})";
		
		Pattern p=Pattern.compile(reg1);  //编译正则
		Matcher m=p.matcher(s1);  // 匹配字符串
		String ok=m.replaceAll("$2/$3/$1");
		System.out.println(ok);
		
	}
	
	// 网页上有图片链接， 用正则抓出文件名
	public static void test10() {
		/*
		常用正则表达式
		规则	正则表达式语法  
		一个或多个汉字	^[\u0391-\uFFE5]+$ 
		邮政编码	^[1-9]\d{5}$
		QQ号码	^[1-9]\d{4,10}$ 
		邮箱	^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$ 
		用户名（字母开头 + 数字/字母/下划线）	^[A-Za-z][A-Za-z1-9_-]+$
		手机号码	^1[3|4|5|8][0-9]\d{8}$ 
		URL	^((http|https)://)?([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ 
		18位身份证号	^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?$


		*/
		
	}
	

	public static void main(String[] args) {
		test9();

	}

}
